package serie07;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Suspense {
	
	// ATTRIBUTS
	
	// Nombre de boutons pour l'application
	private static final int NB_BUTTONS = 3;
	
	// Le modele
	private SuspenseModel model;
	
	// Un label
	private JLabel label;
	
	// La fenetre principale de l'application
    private JFrame frame;
    
    // Un tableau de boutons à placer au nord
    private JButton[] buttons;
    
    // Le bouton pour recommencer une partie
    private JButton replay;
	
	// CONSTRUCTEURS
	
	public Suspense() {
		createModel();
        createView();
        placeComponents();
        createController();
		model.notifyObservers();
	}
	
	// COMMANDES

    /**
     * Rend l'application visible au centre de l'�cran.
     */
    public void display() {
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    
    // OUTILS
    
    private void createModel() {
        model = new StdSuspenseModel(NB_BUTTONS); 
    }
    
    private void createView() {
        frame = new JFrame("Suspense");
        replay = new JButton("Recommencer");
        label = new JLabel("Nombre de clics : " + model.getDrawsNumber());
        buttons = new JButton[model.getMaxNumber()];
        for (int i = 0; i < model.getMaxNumber(); i++) {
            buttons[i] = new JButton("" + (i + 1) + "");
        }
        model.addObserver(new Observer() {
            public void update(Observable o, Object arg) {
            	label.setText("Nombre de clics : " + model.getDrawsNumber());
                if (model.hasLost()) {
                	JOptionPane.showOptionDialog(
                		null,
            		    "Vous avez perdu en " + model.getDrawsNumber() + " coup"
            		        + (model.getDrawsNumber() > 1 ? "s." : "."),
            		    "merci d'avoir joué à ce jeu débile",
            		    JOptionPane.DEFAULT_OPTION,
            		    JOptionPane.INFORMATION_MESSAGE,
            		    null,
            		    new Object[] { replay },
            		    replay
                	);
                }
            }
        });
    }
    
    private void placeComponents() {
        JPanel p = new JPanel(); {
            for (JButton button : buttons) {
            	p.add(button);
            }
        }
        frame.add(p, BorderLayout.NORTH);
        JPanel q = new JPanel(); {
        	q.add(label);
        }
        frame.add(q);
    }
    
    private void createController() {
    	ActionListener al = new ActionListener() {
    		public void actionPerformed(ActionEvent e) {
    			JButton b = (JButton) e.getSource();
    			String s = b.getText();
    			model.drawNumber(Integer.valueOf(s));
    		}
    	};
    	for (JButton b : buttons) {
    		b.addActionListener(al);
    	}
    	replay.addActionListener(new ActionListener() {
    		public void actionPerformed(ActionEvent e) {
    			SwingUtilities.getRoot(replay).setVisible(false);
    			model.reinit();
    		}
    	});
    	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Suspense().display();
            }
        });
    }

}
